/** ***********************************************************************************
* @file         ble_task.h
* @brief        蓝牙数据管理基础任务
* @details      主要用来处理蓝牙底层数据接口 头文件
* @author       杨小珛
* @date         2021/03/16
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef BLE_TASK_H
#define BLE_TASK_H

#include "os_app.h"

typedef void (*ble_drive_state_callback_t) ( uint8_t state );

#define BLE_DATA_MAX_LEN  ( 200 )
#define BLE_DATA_QUEUE_DEPTH  ( 10 )
#define BLE_DATA_SAM_REV_RUN_WAIT_TIME ( 1000 )
#define BLE_DATA_SAM_REV_SLEEP_WAIT_TIME ( 100 )

#define BLE_TASK_INTO_SLEEP_TIME ( 60 )

typedef  struct
{
	uint16_t len;
	uint8_t  *data;
}ble_recv_data_t;

typedef enum
{
    BLE_GATT_INIT = 0x00,
    BLE_GATT_OPEN,
    BLE_GATT_BROAD_OK,
	BLE_GATT_CONNECT,
	BLE_GATT_ERROR,
	BLE_GATT_CLOSE,
}ble_gatt_connect_e;

typedef enum
{
    BLE_POWER_CLOSE = 0x00,
    BLE_POWER_OPEN,
}ble_power_state_e;

typedef  struct
{
	volatile uint16_t acl;
	volatile uint16_t st;
}ble_connect_state_t;

/****************************创建SOCKET 连接后的状态**************************/
typedef enum
{
	BLE_DATA_WRITE =0x00,     /* 写数据 */
	BLE_DATA_READ,             /* 读数据 */
}ble_data_mode_e;

/****************************BLE 连接数据发送/接收总量技术********************/
typedef  struct
{
	volatile uint32_t send;
	volatile uint32_t recv;
}ble_connect_data_counter_t;

/** ****************************************************************************
* @remarks       uint32_t ble_drive_open( char *ble_name ,ble_drive_state_callback_t statr_cb )
* @brief         打开BLE蓝牙
* @param[in]     *ble_name BLE蓝牙名称 
* @param[out]    无
* @return        pdPASS 成功 pdFAIL 失败
* @attention     必须在任务中运行
*******************************************************************************/
extern uint32_t ble_drive_data_open( char *ble_name ,ble_drive_state_callback_t statr_cb );

/** ****************************************************************************
* @remarks       uint32_t ble_drive_data_write( uint8_t *data , uint16_t len )
* @brief         写BLE发送数据
* @param[in]     *data 发送数据地址
* @param[in]     len 发送数据的长度
* @param[out]    无
* @return        pdPASS 成功 pdFAIL 失败
* @attention     必须在任务中运行
*******************************************************************************/
extern uint32_t ble_drive_data_write( uint8_t *data , uint16_t len );

/** ****************************************************************************
* @remarks       uint32_t ble_drive_data_read( uint8_t *data , uint16_t *len , uint32_t time_out )
* @brief         读取BLE接收到的数据
* @param[out]     *data 接收的数据地址
* @param[out]    *len 接收数据的长度
* @param[out]    time_out 读取数据阻塞的时间 单位ms
* @return        pdPASS 成功 pdFAIL 失败
* @attention     必须在任务中运行，可以设置阻塞的时间，将任务挂起；
*******************************************************************************/
extern uint32_t ble_drive_data_read( uint8_t *data , uint16_t *len , uint32_t time_out );

/** ****************************************************************************
* @remarks       uint32_t ble_drive_data_close( void )
* @brief         关闭BLE功能
* @param[in]     
* @param[out]    无
* @return        pdPASS 成功 pdFAIL 失败
* @attention     必须在任务中运行
*******************************************************************************/
extern uint32_t ble_drive_data_close( char *ble_name );

/** ****************************************************************************
* @remarks       uint32_t ble_drive_macaddr_read( char *mac_addr )
* @brief         读取BLE MAC物理地址
* @param[in]     无
* @param[out]    mac_addr 目标地址
* @return        pdPASS 成功 pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint32_t ble_drive_macaddr_read( char *mac_addr );

/** ****************************************************************************
* @remarks       void ble_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         创建BLE基础数据处理任务
* @param[in]     uxPriority 优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void ble_create_task( unsigned portBASE_TYPE uxPriority );

/** ****************************************************************************
* @remarks       void ble_drive_connect_state_set(uint16_t acl, uint16_t st)
* @brief         设置BLE底层返回的连接状态
* @param[in]     acl acl_handle
* @param[in]     st 0 网络断开 1 网络连接成功 
* @param[out]    无
* @return       无
* @attention     无
*******************************************************************************/
extern void ble_drive_connect_state_set(uint16_t acl, uint16_t st);

/** ****************************************************************************
* @remarks       static uint8_t ble_drive_data_semaphore_set(void)
* @brief         发送 BLE底层接收数据的信号量
* @param[in]     无
* @param[out]    无
* @return       无
* @attention     无
*******************************************************************************/
extern void ble_drive_data_semaphore_set(void);

/** ****************************************************************************
* @remarks       void ble_drive_gatt_connect_set( ble_gatt_connect_e st )
* @brief         设置BLE gatt 的连接状态
* @param[in]     无
* @param[out]    无
* @return        返回gatt_connect 状态
* @attention     无
*******************************************************************************/
extern void ble_drive_gatt_connect_set( ble_gatt_connect_e st );

/** ****************************************************************************
* @remarks       static ble_gatt_connect_e ble_drive_gatt_connect_get( void )
* @brief         获取BLE gatt 的连接状态
* @param[in]     无
* @param[out]    无
* @return        返回gatt_connect 状态
* @attention     无
*******************************************************************************/
extern ble_gatt_connect_e ble_drive_gatt_connect_get( void );

/** ****************************************************************************
* @remarks       uint32_t ble_send_data_total_count_get( void )
* @brief         获取BLE 发送的数据总量
* @param[in]     无
* @param[out]    无
* @return        发送数据总量
* @attention     无
*******************************************************************************/
extern uint32_t ble_send_data_total_count_get( void );

/** ****************************************************************************
* @remarks       uint32_t ble_recv_data_total_count_get( void )
* @brief         获取BLE 接收的数据总量
* @param[in]     无
* @param[out]    无
* @return        接收数据总量
* @attention     无
*******************************************************************************/
extern uint32_t ble_recv_data_total_count_get( void );

#endif

